package com.improve.frame.common.constant;

import cn.hutool.core.util.ReUtil;

/**
 * @Description 正则表达式常量
 * @Author wzxing918
 * @Date 2021-03-31
 * @Version 1.0.0
 **/
public class RegexpConstant {
    /**
     * 英文字母 、数字和下划线
     */
    public static final String GENERAL = "^\\w+$";
    /**
     * 数字
     */
    public static final String NUMBERS = "\\d+";
    /**
     * 字母
     */
    public static final String WORD = "[a-zA-Z]+";
    /**
     * 单个中文汉字
     */
    public static final String CHINESE = ReUtil.RE_CHINESE;
    /**
     * 中文汉字
     */
    public static final String CHINESES = ReUtil.RE_CHINESES;
    /**
     * 分组
     */
    public static final String GROUP_VAR = "\\$(\\d+)";
    /**
     * IP v4
     */
    public static final String IPV4 = "\\b((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\b";
    /**
     * IP v6
     */
    public static final String IPV6 = "(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))";
    /**
     * 货币
     */
    public static final String MONEY = "^(\\d+(?:\\.\\d+)?)$";
    /**
     * 邮件，符合RFC 5322规范，正则来自：http://emailregex.com/
     */
    public static final String EMAIL = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)])";

    /**
     * 固定电话
     */
    public static final String FIXED_PHONE = "^0\\d{2,3}-\\d{7,8}|\\(?0\\d{2,3}[)-]?\\d{7,8}|\\(?0\\d{2,3}[)-]*\\d{7,8}$";

    /**
     * 移动电话
     */
    public static final String MOBILE = "(?:0|86|\\+86)?1[3456789]\\d{9}";
    /**
     * 18位身份证号码
     */
    public static final String CITIZEN_ID = "[1-9]\\d{5}[1-2]\\d{3}((0\\d)|(1[0-2]))(([012]\\d)|3[0-1])\\d{3}(\\d|X|x)";
    /**
     * 邮编
     */
    public static final String ZIP_CODE = "[1-9]\\d{5}(?!\\d)";
    /**
     * 生日
     */
    public static final String BIRTHDAY = "^(\\d{2,4})([/\\-.年]?)(\\d{1,2})([/\\-.月]?)(\\d{1,2})日?$";
    /**
     * URL
     */
    public static final String URL = "[a-zA-z]+://[^\\s]*";
    /**
     * Http URL
     */
    public static final String URL_HTTP = "(https://|http://)?([\\w-]+\\.)+[\\w-]+(:\\d+)*(/[\\w- ./?%&=]*)?";
    /**
     * 中文字、英文字母、数字和下划线
     */
    public static final String GENERAL_WITH_CHINESE = "^[\u4E00-\u9FFF\\w]+$";
    /**
     * UUID
     */
    public static final String UUID = "^[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}$";
    /**
     * 不带横线的UUID
     */
    public static final String UUID_SIMPLE = "^[0-9a-z]{32}$";
    /**
     * MAC地址正则
     */
    public static final String MAC_ADDRESS = "((?:[A-F0-9]{1,2}[:-]){5}[A-F0-9]{1,2})|(?:0x)(\\d{12})(?:.+ETHER)";
    /**
     * 16进制字符串
     */
    public static final String HEX = "^[a-f0-9]+$";
    /**
     * 时间正则
     */
    public static final String TIME = "\\d{1,2}:\\d{1,2}(:\\d{1,2})?";
    /**
     * 中国车牌号码（兼容新能源车牌）
     */
    public static final String PLATE_NUMBER =
            "^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[ABCDEFGHJK])|([ABCDEFGHJK]([A-HJ-NP-Z0-9])[0-9]{4})))|" +
                    "([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]\\d{3}\\d{1,3}[领])|" +
                    "([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$";


    /**
     * 社会统一信用代码
     * <pre>
     * 第一部分：登记管理部门代码1位 (数字或大写英文字母)
     * 第二部分：机构类别代码1位 (数字或大写英文字母)
     * 第三部分：登记管理机关行政区划码6位 (数字)
     * 第四部分：主体标识码（组织机构代码）9位 (数字或大写英文字母)
     * 第五部分：校验码1位 (数字或大写英文字母)
     * </pre>
     */
    public static final String CREDIT_CODE = "^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$";

    /**
     * 银行卡号
     */
    public static final String BANK_CARD = "^[1-9]\\d{9,29}$";

    /**
     * 一般密码强度验证
     *
     * <pre>
     * 1.长度位8-16位
     * 2.至少包含一个数字
     * 3.至少包含一个大写和小写字母
     * </pre>
     */
    public static final String PASSWORD = "^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).{8,16}$";

    /**
     * 一般密码强度验证
     *
     * <pre>
     * 1.长度位8-16位
     * 2.至少包含一个数字
     * 3.至少包含一个大写和小写字母
     * 4.至少包含一个特殊字符
     * </pre>
     */
    public static final String PASSWORD_SPEC = "^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)(?=.*[~!@#$%^&*])[\\da-zA-Z~!@#$%^&*]{8,16}$";

    /**
     * 密码强度验证
     * <pre>
     * 1.长度位8-16位
     * 2.至少包含一个数字
     * 3.至少包含一个大写和小写字母
     * 4.至少包含一个特殊字符
     * 5.不能出现有“碧桂园”、“博智林”等含义的字母加年份的密码组合
     */
    public static final String PASSWORD_BVC = "^(?i)(?!(bgy|bzl)\\d{4})(?-i)(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)(?=.*[~!@#$%^&*])[\\da-zA-Z~!@#$%^&*]{8,16}$";

    /**
     * Base64图片编码
     */
    public static final String BASE64_IMAGE = "^\\s*data:image/[a-z]+;base64,[a-zA-Z0-9!$&',()*+;=\\-._~:@\\/?%\\s]*?\\s*$";
}